package com.jmb.demo.Container;


import com.jmb.demo.simple.Pair;

/**
 * 除了泛型类，方法也可以是泛型的，而且，一个方法是不是泛型的，与它所在的类是不是泛型没有什么关系。
 * 下边来实现一个泛型类
 * 比如 下边的 indexOf表示一个算法，在给定数组中寻找某个元素，这个算法的基本过程与具体数据类型没有什么关系，
 * 只不过我们通过泛型，它可以方便地应用于各种数据类型，且由编译器保证类型安全。
 */
public class GenericFun {
     // 这个地方，<T>简单理解，他的作用是声明我们这是一个泛型方法,Int是我们的返回类型,T是我们传入的方法
    public static <T> int indexOf(T[] arr,T elm){
        for (int i = 0; i <arr.length ; i++) {
            // equals是比较内容是否一致。
            if (arr[i].equals(elm)){
                return i;
            }
        }
        // 返回负1代表我们执行失败
        return -1;
    }
    // 和泛型类一样，我们这里的一个类型参数也可以有多个，比如下边这个例子
    // 这里的Pair<U,V>是我们的返回类型
    public static <U,V> Pair<U,V> makePair(U first,V second){
        Pair<U,V> pair = new Pair<>(first,second);
        return pair;
    }
    public static void main(String[] args) {
        // 我们调用上边的泛型方法,这个地方就是一个比较
//        int a = indexOf(new Integer[]{1, 3, 5}, 10);
//        System.out.println(a);
        // 我们也可以这样调用泛型方法
        System.out.println(indexOf(new String[]{"金","金博","金博博"},"金子"));
        // 我们这里调用一下，我们那个上边写的方法，调用泛型方法和泛型类不一样，因为泛型方法我们不用声明类型，java可以自行推断的
         System.out.println(makePair(1,"金梦博")); // 但是这个返回的是我们java的类信息

    }
}
